package props

import (
	"reflect"

	"gitee.com/night-tc/gobige/msgdef"
	"gitee.com/night-tc/gobige/msgdef/protomsg"
)

/*
单个属性更新器
*/
type IProp interface {
	// 获取字段Index
	GetIndex() uint32
	// 获取字段名字
	GetName() string
	GetField() *FieldDef
	// 设置属性值（标脏）
	SetValue(v interface{})
	// 设置属性值（不标脏）
	LoadValue(v interface{})
	// 获取属性值
	GetValue() interface{}
	// 是否同步脏数据
	IsSyncDirty() bool
	// 是否保存脏数据
	IsSaveDirty() bool
	// 是否标脏了
	IsDirty(dType EDPSorterType) bool
	// 设置同步标脏
	setSync(sync bool)
	// 设置保存标脏
	setSave(v bool)
	// 设置标脏
	SetDirty()
	// 设置指定分流器标脏
	SetDirty2(dType EDPSorterType)
	// 从同步消息里读数据
	ReadSyncProp(msg *protomsg.SyncProp)
}

// 单个属性更新器
type PropInfo[T any] struct {
	value    T
	syncFlag bool
	dbFlag   bool
	pmgr     *PropDirtyMgr
	field    *FieldDef
}

// 新建属性到管理器中
func NewProp[T any](pmgr *PropDirtyMgr, index uint32) (result *PropInfo[T]) {
	result = new(PropInfo[T])
	result.field = pmgr.getField(index)
	result.pmgr = pmgr
	result.setValueDefualt()
	pmgr.setProp(result)
	return result

}

// 获取字段Index
func (this *PropInfo[T]) GetIndex() uint32 {
	if this.field == nil {
		return 0
	}

	return this.field.Index
}

// 获取字段名字
func (this *PropInfo[T]) GetName() string {
	if this.field == nil {
		return ""
	}

	return this.field.Name
}

// 获取属性的字段信息
func (this *PropInfo[T]) GetField() *FieldDef {
	return this.field
}

// 设置属性值（标脏）
func (this *PropInfo[T]) SetValueT(v T) {
	this.value = v
	if this.pmgr != nil {
		this.pmgr.setPropDirty(this)
	}
}

// 设置属性值（不标脏）
func (this *PropInfo[T]) LoadValueT(v T) {
	this.value = v
}

// 获取属性值
func (this *PropInfo[T]) GetValueT() T {
	return this.value
}

// 设置属性值（标脏）
func (this *PropInfo[T]) SetValue(v interface{}) {
	this.value = v.(T)
	if this.pmgr != nil {
		this.pmgr.setPropDirty(this)
	}
}

// 设置属性值（不标脏）
func (this *PropInfo[T]) LoadValue(v interface{}) {
	this.value = v.(T)
}

// 获取字段值
func (this *PropInfo[T]) GetValue() interface{} {
	return this.value
}

// 是否同步脏数据
func (this *PropInfo[T]) IsSyncDirty() bool {
	return this.syncFlag
}

// 是否保存脏数据
func (this *PropInfo[T]) IsSaveDirty() bool {
	return this.dbFlag
}

// 是否标脏了
func (this *PropInfo[T]) IsDirty(dType EDPSorterType) bool {
	switch dType {
	case EDPSorterTypeSync:
		return this.IsSyncDirty()
	case EDPSorterTypeSave:
		return this.IsSaveDirty()
	}
	return false
}

// 设置同步标脏
func (this *PropInfo[T]) setSync(sync bool) {
	this.syncFlag = sync
}

// 设置保存标脏
func (this *PropInfo[T]) setSave(v bool) {
	this.dbFlag = v
}

// 设置标脏
func (this *PropInfo[T]) SetDirty() {
	if this.pmgr != nil {
		this.pmgr.setPropDirty(this)
	}
}

// 设置指定分流器标脏
func (this *PropInfo[T]) SetDirty2(dType EDPSorterType) {
	if this.pmgr != nil {
		this.pmgr.setPropDirty2(this, dType)
	}
}

// 设置默认值
func (this *PropInfo[T]) setValueDefualt() {
	if this.field.RefType.Kind() == reflect.Struct {
		this.value = reflect.New(this.field.RefType).Interface().(T)
	}
	// reft := reflect.TypeOf(this.value)
	// if reft.Kind() == reflect.Pointer {
	// 	this.value = reflect.New(reft.Elem()).Interface().(T)
	// }
	// switch this.field.TypeName {
	// case "int8":
	// 	this.LoadValue(int8(0))
	// case "int16":
	// 	this.LoadValue(int16(0))
	// case "int32":
	// 	this.LoadValue(int32(0))
	// case "int64":
	// 	this.LoadValue(int64(0))
	// case "byte":
	// 	this.LoadValue(byte(0))
	// case "uint8":
	// 	this.LoadValue(uint8(0))
	// case "uint16":
	// 	this.LoadValue(uint16(0))
	// case "uint32":
	// 	this.LoadValue(uint32(0))
	// case "uint64":
	// 	this.LoadValue(uint64(0))
	// case "float32":
	// 	this.LoadValue(float32(0))
	// case "float64":
	// 	this.LoadValue(float64(0))
	// case "string":
	// 	this.LoadValue("")
	// case "bool":
	// 	this.LoadValue(false)
	// default:
	// 	msgd, err := msgdef.GetTypeMgr().GetMsgDefByName(this.field.TypeName)
	// 	if err != nil {
	// 		logger.Errorf("getTypeByStr:%s %v", this.field.TypeName, err)
	// 	}
	// 	this.LoadValue(msgd.New())
	// }
}

// 从同步消息里读数据
func (this *PropInfo[T]) ReadSyncProp(msg *protomsg.SyncProp) {
	switch this.GetValue().(type) {
	case bool:
		this.LoadValue(msg.GetBoolValue())
	case int8:
		this.LoadValue(int8(msg.GetInt32Value()))
	case int16:
		this.LoadValue(int16(msg.GetInt32Value()))
	case int32:
		this.LoadValue(msg.GetInt32Value())
	case int64:
		this.LoadValue(msg.GetInt64Value())
	case uint8:
		this.LoadValue(uint8(msg.GetUint32Value()))
	case uint16:
		this.LoadValue(uint16(msg.GetUint32Value()))
	case uint32:
		this.LoadValue(msg.GetUint32Value())
	case uint64:
		this.LoadValue(msg.GetUint64Value())
	case float32:
		this.LoadValue(msg.GetFloatValue())
	case float64:
		this.LoadValue(msg.GetDoubleValue())
	case string:
		this.LoadValue(msg.GetStringValue())
	case msgdef.IMsg:
		d := this.GetValue().(msgdef.IMsg)
		d.Reset()
		_ = d.Unmarshal(msg.GetMsg_Value())
	}
}
